
class Game{
    #inkey(){
        document.onkeydown = (e)=> {
            console.log(e.keyCode);
            // 键盘编码
            // 37 -l
            // 38 -t
            // 39 - r
            // 40 - b
            switch (e.keyCode) {
                case 37:
                    this.snake.direction = "left";
                    break;
                case 38:
                    this.snake.direction = "top";
                    break;
                case 39:
                    this.snake.direction = "right";
                    break;
                case 40:
                    this.snake.direction = "bottom";
                    break;
            }
        };
        // this.binkey();
    }
    // 控制蛇的方向的方法,私有函数，不能被外部访问到。
    // 让蛇运动起来的方法
    #runSnake(){
        // 开启一个定时器，让蛇连续运动起来
        let speed = setInterval(() => {
            // 让蛇运动起来
            this.snake.move();
            // 删除上一次的蛇
            this.snake.remove(this.map);
            this.snake.render(this.map);
            // 每移动一次，都要判断是否出了地图，游戏是否结束
            // 记录一下最大的位置
            let maxx = this.map.clientWidth / this.snake.width;
            let maxy = this.map.clientHeight / this.snake.height;
            // 找到当前蛇头的位置
            let headx = this.snake.body[0].x;
            let heady = this.snake.body[0].y;
            // 获取食物的坐标
            // 蛇头的具体坐标
            let hX = headx * this.snake.width;
            let hY = heady * this.snake.height;
            // 将食物数组中每一个都要进行对比
            // 谁被吃掉，删除自己，渲染一个新的元素
            for(let i = 0;i<this.food.elements.length;i++){
                if(this.food.elements[i].offsetLeft == hX && this.food.elements[i].offsetTop == hY){
                    // 条件满足，蛇头迟到了食物
                    // 让食物删除，渲染一个新的食物
                    this.food.remove(this.map,i);
                    this.food.render(this.map);
                    // 添加一个新的蛇结
                    let last = this.snake.body[this.snake.body.length - 1];
                    this.snake.body.push({
                        x: last.x,
                        y: last.y,
                        color: last.color
                    });
                }
            }

            // 进行判断是否游戏结束
            if (headx < 0 || headx >= maxx || heady < 0 || heady >= maxy) {
                // 游戏结束
                clearInterval(speed);
                alert("游戏结束");
            }
            // 判断蛇头是否吃到了食物,并且让自己增加了一节

        }, 150);
    }
    constructor(map){
        // 游戏规则构造函数,基础属性
        let thay;
        // 设置三个属性，存储 食物，蛇，地图
        this.food = new Food();
        this.snake = new Snake();
        this.map = map;
    }
    //游戏初始化
    start(){
        // 添加蛇和食物到地图上
        // 让游戏逻辑开始
        // 让蛇运动起来，默认向右
        // 通过上下左右控制蛇的运动方向
        // 判断蛇头是否与食物是否碰撞，吃掉食物
        // 是否超出地图范围，结束游戏
        this.food.render(this.map);
        this.food.render(this.map);
        this.food.render(this.map);
        this.snake.render(this.map);
        this.#runSnake();
        this.#inkey();
    }
 

}

